home *** CD-ROM | disk | FTP | other *** search
/ Openstep 4.2 (Developer) / Openstep Developer 4.2.iso / NextDeveloper / Source / GNU / perl / Perl / ext / ODBM_File / ODBM_File.xs < prev    next >
Encoding:
Text File  |  1995-01-15  |  1.8 KB  |  96 lines

  1. #include "EXTERN.h"
  2. #include "perl.h"
  3. #include "XSUB.h"
  4.  
  5. #ifdef NULL
  6. #undef NULL
  7. #endif
  8. #include <dbm.h>
  9.  
  10. #include <fcntl.h>
  11.  
  12. typedef void* ODBM_File;
  13.  
  14. #define odbm_FETCH(db,key)            fetch(key)
  15. #define odbm_STORE(db,key,value,flags)        store(key,value)
  16. #define odbm_DELETE(db,key)            delete(key)
  17. #define odbm_FIRSTKEY(db)            firstkey()
  18. #define odbm_NEXTKEY(db,key)            nextkey(key)
  19.  
  20. static int dbmrefcnt;
  21.  
  22. #ifndef DBM_REPLACE
  23. #define DBM_REPLACE 0
  24. #endif
  25.  
  26. MODULE = ODBM_File    PACKAGE = ODBM_File    PREFIX = odbm_
  27.  
  28. ODBM_File
  29. odbm_TIEHASH(dbtype, filename, flags, mode)
  30.     char *        dbtype
  31.     char *        filename
  32.     int        flags
  33.     int        mode
  34.     CODE:
  35.     {
  36.         char tmpbuf[1025];
  37.         if (dbmrefcnt++)
  38.         croak("Old dbm can only open one database");
  39.         sprintf(tmpbuf,"%s.dir",filename);
  40.         if (stat(tmpbuf, &statbuf) < 0) {
  41.         if (flags & O_CREAT) {
  42.             if (mode < 0 || close(creat(tmpbuf,mode)) < 0)
  43.             croak("ODBM_File: Can't create %s", filename);
  44.             sprintf(tmpbuf,"%s.pag",filename);
  45.             if (close(creat(tmpbuf,mode)) < 0)
  46.             croak("ODBM_File: Can't create %s", filename);
  47.         }
  48.         else
  49.             croak("ODBM_FILE: Can't open %s", filename);
  50.         }
  51.         RETVAL = (void*)(dbminit(filename) >= 0 ? &dbmrefcnt : 0);
  52.         ST(0) = sv_mortalcopy(&sv_undef);
  53.         sv_setptrobj(ST(0), RETVAL, "ODBM_File");
  54.     }
  55.  
  56. void
  57. DESTROY(db)
  58.     ODBM_File    db
  59.     CODE:
  60.     dbmrefcnt--;
  61.     dbmclose();
  62.  
  63. datum
  64. odbm_FETCH(db, key)
  65.     ODBM_File    db
  66.     datum        key
  67.  
  68. int
  69. odbm_STORE(db, key, value, flags = DBM_REPLACE)
  70.     ODBM_File    db
  71.     datum        key
  72.     datum        value
  73.     int        flags
  74.     CLEANUP:
  75.     if (RETVAL) {
  76.         if (RETVAL < 0 && errno == EPERM)
  77.         croak("No write permission to odbm file");
  78.         croak("odbm store returned %d, errno %d, key \"%s\"",
  79.             RETVAL,errno,key.dptr);
  80.     }
  81.  
  82. int
  83. odbm_DELETE(db, key)
  84.     ODBM_File    db
  85.     datum        key
  86.  
  87. datum
  88. odbm_FIRSTKEY(db)
  89.     ODBM_File    db
  90.  
  91. datum
  92. odbm_NEXTKEY(db, key)
  93.     ODBM_File    db
  94.     datum        key
  95.  
  96.